package com.provafinal.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

public class RelatorioUtil {

    private static final int RELATORIO_PDF = 1;
    private static final int RELATORIO_EXCEL = 2;
    private static final int RELATORIO_HTML = 3;
    private static final int RELATORIO_PLANILHA_OPEN_OFFICE = 4;

    public StreamedContent geraRelatorio(HashMap parametrosRelatorio, String nomeRelatorioJasper, String nomeRelatorioSaida, int tipoRelatorio) throws FileNotFoundException, JRException, SQLException {
        StreamedContent arquivoRetorno = null;
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            Connection conexao = this.getConexao();
            String caminhoRelatorio = context.getExternalContext().getRealPath("relatorios");
            String camilhoArquivoJasper = caminhoRelatorio + File.separator + nomeRelatorioJasper + ".jasper";
            String caminhoArquivoRelatorio = null;
            JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(camilhoArquivoJasper);
            JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametrosRelatorio, conexao);
            JRExporter tipoArquivoExportado = null;
            String extensaoArquivoExportado = "";
            File arqivoGerado = null;
            switch (tipoRelatorio) {
                case RelatorioUtil.RELATORIO_PDF:
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
                    break;
                case RelatorioUtil.RELATORIO_HTML:
                    tipoArquivoExportado = new JRHtmlExporter();
                    extensaoArquivoExportado = "html";
                    break;
                case RelatorioUtil.RELATORIO_EXCEL:
                    tipoArquivoExportado = new JRXlsExporter();
                    extensaoArquivoExportado = "xls";
                    break;
                case RelatorioUtil.RELATORIO_PLANILHA_OPEN_OFFICE:
                    tipoArquivoExportado = new JROdtExporter();
                    extensaoArquivoExportado = "ods";

                default:
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
                    break;
            }

            caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatorioSaida + "." + extensaoArquivoExportado;
            arqivoGerado = new java.io.File(caminhoArquivoRelatorio);
            tipoArquivoExportado.setParameter(JRExporterParameter.JASPER_PRINT, impressoraJasper);
            tipoArquivoExportado.setParameter(JRExporterParameter.OUTPUT_FILE, arqivoGerado);
            tipoArquivoExportado.exportReport();
            arqivoGerado.deleteOnExit();
            InputStream conteudoRelatorio = new FileInputStream(arqivoGerado);
            arquivoRetorno = new DefaultStreamedContent(conteudoRelatorio, "application/" + extensaoArquivoExportado, nomeRelatorioSaida + "." + extensaoArquivoExportado);

        } catch (JRException e) {
            throw new JRException("Não foi possivel gerar o relatorio" + e);
        } catch (FileNotFoundException e) {
            throw new JRException("Arquivo do relatorio não encontrado" + e);
        }
        return arquivoRetorno;
    }

    private Connection getConexao() throws SQLException {
        java.sql.Connection conexao = null;
        try {
            Context iniciaContexto = new InitialContext();
            Context envContexto = (Context) iniciaContexto.lookup("java:/com/env/");
            javax.sql.DataSource ds = (javax.sql.DataSource) envContexto.lookup("jdbc/agenda");
            conexao = ds.getConnection();
        } catch (NamingException e) {
            throw new SQLException("Não foi possivel encontrar o nome da conexao do banco", e);
        } catch (SQLException e) {
            throw new SQLException("Ocorreu um erro de SQL", e);
        }
        return conexao;
    }
}
